<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mixin模式</title>
</head>
<body>
    
</body>
</html>

<script>
    /*
    //想要使用一个对象  使用很多对象里面的方法    就要继承   如果还要使用别的当前对象没有的   继续继承 
    //这种继承很乱   造成内存增大
    function extend(sub,sup){
        sub.prototype = Object.create(sup.prototype);
        sub.prototype.constructor = sub;
    }
    function Credit(){}
    function Request(){}
    function User(name,age){
        this.name = name;
        this.age = age;
    }
    extend(Request,Credit);
    extend(User,Request);
    Credit.prototype.total = function(){
        console.log('统计积分');
    }

    Request.prototype.ajax = function(){
        console.log('请求后台');
    }

    User.prototype.show = function(){
        console.log(this.name,this.age)
    }
    
    function Admin(...args){
        User.apply(this,args);
    }
    extend(Admin,User);
    let hd = new Admin("向军",19);
    // hd.show();
    // hd.total();
    // hd.ajax();
    console.dir(hd);
    */

    //下面分拆功能使用Mixin模式实现多继承，使用代码结构更加清晰，只让Admin继承User原型
    //其实原理就是   将所有需要继承的对象当做一个变量   然后核心就是使用Object.assign()  给User的原型中增加方法
    //最后使用 Admin 来继承  User   然后User中拥有的方法  Admin的实例化对象都是可以使用的
    function extend(sub,sup){
        sub.prototype = Object.create(sup.prototype);
        sub.prototype.constructor = sub;
    }

    function User(name,age){
        this.name = name;
        this.age = age;
    }

    User.prototype.show = function(){
        console.log(this.name,this.age);
    }

    //积分对象
    const Credit = {
        total(){
            console.log('统计积分');
        }
    };

    const Request = {
        ajax(){
            console.log("请求后台");
        }
    };

    function Admin(...args){
        User.apply(this,args);
    }

    extend(Admin,User);
    //对象合并
    Object.assign(User.prototype,Request,Credit);
    let hd = new Admin("向军",19);
    // hd.show();
    // hd.ajax();
    // hd.total();
    console.dir(hd);
    




</script>